#include <stdlib.h>

#include "inventaire.h"

#include "constantes_et_macros.h"





void init_inventaire(struct inventaire* invent)
{
    invent->prem = NULL;
}



void detruire_inventaire(struct inventaire* invent)
{
    struct objet* p_objet;
    struct objet* temp;

    p_objet = invent->prem;
    while(p_objet)
    {
        temp = p_objet->suiv;
        free(p_objet);
        p_objet = temp;
    }
}


char ajouter_exemplaires(struct inventaire* invent, const unsigned int id,
                         const unsigned int quantite)
{
    struct objet* p_objet;
    struct objet* precedent;
    char trouve;

    /* il faut tout d'abord voir si l'objet est deja dans la liste ou non */
    trouve = FAUX;
    precedent = NULL;
    p_objet = invent->prem;
    while(p_objet && p_objet->id <= id)
    {
        if(p_objet->id == id)
        {
            trouve = VRAI;
            break;
        }
        precedent = p_objet;
        p_objet = p_objet->suiv;
    }
    if(trouve)
    {
        if((p_objet->quantite += quantite) > MAX_Q_OBJET)
            p_objet->quantite = MAX_Q_OBJET;
        return FAUX;
    }
    else
    {
        /*
         * objet non trouve, il faut l'inserer dans la liste. Notez que
         * sa place est apres l'element pointe par precedent, car on s'arrete
         * lorsque l'id de l'objet pointe par p_objet est trop grand
         * (rappel : les objets sont classes par ordre d'id croissant)
         */
        if(!(p_objet = (struct objet*)malloc(sizeof(struct objet))))
            exit(EXIT_MALLOC);
        if(precedent)
        {
            /* cas dans lequel l'objet ne sera pas en premiere position */
            p_objet->suiv = precedent->suiv;
            precedent->suiv = p_objet;
        }
        else
        {
            /* cas dans lequel l'objet sera en premiere position */
            p_objet->suiv = invent->prem;
            invent->prem = p_objet;
        }
        p_objet->id = id;
        if((p_objet->quantite = quantite) > MAX_Q_OBJET)
            p_objet->quantite = MAX_Q_OBJET;
        return VRAI;
    }
}



void enlever_exemplaires(struct inventaire* invent, const unsigned int id,
                         const unsigned int quantite)
{
    struct objet* p_objet;

    p_objet = invent->prem;
    while(p_objet->id != id)
        p_objet = p_objet->suiv;
    p_objet->quantite -= quantite;
}



